package com.ricky.mq.client.session;

import com.ricky.mq.client.code.listener.MessageListener;
import com.ricky.mq.client.code.listener.MsgAssignment;
import com.ricky.mq.client.message.BoringMessage;
import com.ricky.mq.client.message.model.BoringMsgModel;
import com.ricky.mq.client.message.model.BoringQueue;
import com.ricky.mq.client.message.model.BoringTopic;

/**
 * 客户端会话管理器
 *
 * @author ricky
 * @since 2020.06.18
 */
public interface BoringSession {
    /**
     * 同步发送
     */
    int SYNC_MODEL = 1;
    /**
     * 异步发送
     */
    int ASYNC_MODEL = 2;

    /**
     * 创建一个以queueName命名的队列，默认容量Integer.MAX_VALUE
     *
     * @param queueName 队列名
     * @return BoringQueue
     */
    BoringQueue createBoringQueue(String queueName);

    /**
     * 创建一个以queueName命名,maxSize容量的队列
     *
     * @param queueName 队列名
     * @param maxSize   最大容量
     * @return BoringQueue
     */
    BoringQueue createBoringQueue(String queueName, int maxSize);

    /**
     * 创建一个以topicName命名的主题
     *
     * @param topicName 主题名
     * @return BoringTopic
     */
    BoringTopic createBoringTopic(String topicName);

    /**
     * 创建一个以topicName命名,maxSize容量的主题
     *
     * @param topicName 主题名
     * @param maxSize   最大容量
     * @return BoringTopic
     */
    BoringTopic createBoringTopic(String topicName, int maxSize);

    /**
     * 发送消息至服务器
     *
     * @param boringMessage  消息
     * @param boringMsgModel 消息模型
     * @return 是否成功
     * @Param msgModelName 消息类型名
     */
    boolean doSend(BoringMessage boringMessage, BoringMsgModel boringMsgModel);

    /**
     * 监听队列消息
     *
     * @param queueName       队列名
     * @param messageListener 监听器对象
     */
    default void listenerQueueMessage(String queueName, MessageListener messageListener) {
        MsgAssignment.addQueueMessageListener(queueName, messageListener);
    }

    /**
     * 监听广播消息
     *
     * @param topicName       广播名
     * @param messageListener 监听器对象
     */
    default void listenerTopicMessage(String topicName, MessageListener messageListener) {
        MsgAssignment.addTopicMessageListener(topicName, messageListener);
    }
}
